#pragma once

#include <functional>
#include <memory>

class EventLoop;

class Channel {
public:
    using EventCallback = std::function<void()>;

    Channel(EventLoop* loop, int fd);
    ~Channel();

    void handleEvent(); // 由 EventLoop 在事件发生时调用

    void setReadCallback(EventCallback cb)   { readCallback_ = std::move(cb); }
    void setWriteCallback(EventCallback cb)  { writeCallback_ = std::move(cb); }
    void setCloseCallback(EventCallback cb)  { closeCallback_ = std::move(cb); }
    void setErrorCallback(EventCallback cb)  { errorCallback_ = std::move(cb); }

    int  fd() const { return fd_; }
    int  events() const { return events_; }
    void setRevents(int revt) { revents_ = revt; }

    void enableReading();    // 添加对读事件的关注
    void enableWriting();    // 添加对写事件的关注
    void disableWriting();   // 取消对写事件的关注
    void disableAll();       // 取消所有关注
    bool isWriting() const;

    void update();           // 通知 EventLoop 修改关注事件
    void remove();           // 通知 EventLoop 删除该 Channel

private:
    EventLoop* loop_;
    const int fd_;
    int events_;     // 当前关注的事件
    int revents_;    // 实际发生的事件，由 Poller 设置
    bool inPoller_;  // 是否在 Poller 中

    EventCallback readCallback_;
    EventCallback writeCallback_;
    EventCallback closeCallback_;
    EventCallback errorCallback_;
};
